#include<bits/stdc++.h>
using namespace std;
// int zgy(int x,int y){
//     if(x<y) swap(x,y);
//     if(x%y==0) return y;
//     return zgy(y,x%y);
// }
// struct fs{
//     int fz,fm;
// };
// fs yf(fs x){
//     int ys=zgy(x.fz,x.fm);
//     x.fz/=ys;
//     x.fm/=ys;
//     return x;
// }
// fs cf(fs x,fs y){
//     fs z;
//     z.fz=x.fz*y.fz;
//     z.fm=x.fm*y.fm;
//     return yf(z);
// }
// fs kpf(fs x){
//     double FZ=x.fz,FM=x.fm;
//     FZ=sqrt(FZ),FM=sqrt(FM);
//     x.fz=FZ*100,x.fm=FM*100;
//     return yf(x);
// }
// void check(){
//     return ;
// }
// void lybb(int x){
//     if (x>JJQ) return ;
//     jqq[x]=1;
//     check();
//     lybb(x+1);
    
//     jqq[x]=0;
//     check();
//     lybb(x+1);
// }

int T,n,m,l,V,d[100005],v[100005],a[100005],p[100005],flaG,galf[100005];
// int jjq[100005],JJQ,jqq[100005];
int main(){
    freopen("detect.in","r",stdin);
    freopen("detect.out","w",stdout);
    cin>>T;
    for(int t=1;t<=T;t++){
        int jsq=0;
        cin>>n>>m>>l>>V;
        for(int i=1;i<=n;i++){
            cin>>d[i]>>v[i]>>a[i];
            if(a[i]<0) flaG=1;
        }
        for(int i=1;i<=m;i++){
            cin>>p[i];
        }
        sort(p+1,p+m+1);


        //------------------------------------------------


        for(int i=1;i<=n;i++){
            double sssd;
            int zjd,zyd;
            if(a[i]>=0)
                sssd=sqrt(v[i]*v[i] + 2*a[i]*(p[m]-d[i]) );
            else {

                //----!!!----
                int FFlag=0;
                for(int j=1;j<=m;j++){
                    if(p[j]>=d[i]&&FFlag==0) {zjd=j; break;}
                    if(FFlag==1) galf[j]=1;
                    // if(p[j] >= (-0.5*v[i]*v[i]/a[i])) {zyd=j; break;}
                }
                //----!!!----
                
                

                sssd=sqrt(v[i]*v[i] + 2*a[i]*(p[zjd]-d[i]) );
            }
                
            if(sssd>V) jsq++;
        
        }
        cout<<jsq<<' ';

        //-----------------------------------------------------

        if(flaG==0){cout<<m-1<<'\n'; continue;}
        else cout<<random()<<'\n';
        // for(int i=1;i<=m;i++){
        //     if(galf[i]==1) jjq[++JJQ]=i;
        // }

        
    }
    return 0;
}
// 1    
// 5 5 15 3
// 0 3 0  
// 12 4 0  
// 1 1 4  
// 5 5 ‐2  
// 6 4 ‐4  
// 2 5 8 9 15
